package com.magist.manage.web.filter;

import com.magist.core.util.EmojiUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
        > **2、常用 API 使用**
        > - EmojiParser.parseToAliases(string); 将表情符号转为字符
        > - EmojiParser.parseToUnicode(string); 将字符转为表情符号

        工具都好了，接下来就是和 Spring MVC 谈一下合作了

        # 四、接入 Spring MVC

        目前有了工具还不够，怎么用呢？每个地方都调用一次吗？APP 请求了后端在 Controller 中调用 `EmojiUtils.toUnicode(string)`？然后在调用查询业务时再调用 `EmojiUtils.toAliases(string)`？这样感觉好大的代码量啊，瞬间想回家种田了。梦醒了生活还是要继续的，到底能不能在某个地方统一处理一下啊？可以的，Spring MVC 中给我们提供了一系列的方案。

        - 数据在服务器玩了一圈，而我们要做的是在它 进门的时候`将表情符号转为字符`，而在它要离开时 返回数据`将字符转为表情符号`
        - 入口：`OncePerRequestFilter`过滤器
        - 出口：`HttpMessageConverter`消息转换器

        ## 4.1 自定义过滤器

        这里统一处理提交的数据，如果有 Emoji 就进行转换，下一步才交给 Controller 处理。

        ```java
 **/
/**
 * Emoji's 编码过滤器
 *
 * @author ybin
 * @since 2017-04-14
 */
@WebFilter(filterName = "emojiFilter",urlPatterns = {"/*"})
public class EmojiEncodingFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        request = new HttpServletRequestWrapper(request) {

            @Override
            public String getParameter(String name) {
                // 参数名
                // 返回值之前 先进行 Emoji 转化
                String aliases = super.getParameter(name);
                if(!StringUtils.isEmpty(aliases)) {
                    aliases = EmojiUtils.toAliases(super.getParameter(name));
                }
                return aliases;
            }

            @Override
            public String[] getParameterValues(String name) {
                // 参数值
                // 返回值之前 先进行 Emoji 转化
                String[] values = super.getParameterValues(name);
                if (values != null) {
                    for (int i = 0; i < values.length; i++) {
                        values[i] = EmojiUtils.toAliases(values[i]);
                    }
                }
                return values;
            }

        };

        filterChain.doFilter(request, response);
    }

}

